package com.cskaoyan.javase.oop1._1basic;

import java.io.PushbackInputStream;

/**
 * 对象的创建以及使用,类的定义
 * 这里给出一个案例：
 * 创建学生对象，然后使用访问学生对象的属性，使用学生对象的行为。
 * 要想创建Student对象,首先需要定义Student类,因为类是创建对象的模板
 *
 * 1.类的定义
 * 类的定义语法我们并不陌生，即：
 * [类修饰符列表] class 类名{
 *   // 类体
 * }
 * 解释:
 *      1.可以用来修饰class类的修饰符是很少的,今天我们不探讨了
 *          只需要知道: 在一个java文件中,public class只能有一个,非public class可以有多个
 *          它们是同包的关系
 *      2.类名,应该大驼峰,见名知意,尽量使用合法的英文单词
 *      3.类体可以自由发挥
 * 约定:
 *      在实际开发中，绝大多数情况下，一个Java文件里往往都只有一个和文件名相同的public class。
 *      但为了上课方便，避免切换Java文件导致的麻烦，我们约定：
 *      以一个public class作为测试类，然后在下面定义非public class用于测试！
 *      比如本案例中,定义一个public class Demo 作为测试类
 *          再定义一个非public class Student作为被测试类
 *
 * 注意事项:
 *      实际上在Java当中,类的定义和方法的定义不同
 *      方法在定义时,是不能嵌套的
 *      但是定义类不同,类是可以嵌套定义的,称之为"嵌套类"/内部类
 *      内部类的语法大家还没学过
 *      请大家学过以后再用
 *
 * 2.类自身的定义是非常简单的,接下来我们重点讲一下类体的定义
 * 类是创建对象的模板,所以类抽取了全体对象,在属性和行为上的共性.
 * 所以类就必须要能够描述对象在属性和行为上的共性.
 *
 * 类体中如何描述全体对象属性的共性呢?
 *      在类中用成员变量来描述对象共性的属性。
 * 什么是成员变量?
 *      定义在成员位置的变量,就是成员变量
 * 什么是成员位置?
 *      在类体中,排除掉局部位置的位置,就是成员位置
 *      说白了,就是类体中,方法体外的区域,也就是大家定义方法的位置
 *
 * 成员变量的语法: [修饰符列表] 数据类型 成员变量名;
 *      解释:
 *      1.可以用来修饰成员变量的修饰符有很多,后面慢慢学.今天我们先默认不写,不写任何修饰符.
 *      2.数据类型可以是基本数据类型,也可以是引用数据类型
 *      3.变量名,小驼峰,见名知意,尽量用英文单词
 *
 *
 * 类体中如何描述全体对象行为上的共性呢?
 *      在类中用成员方法来描述对象共性的行为。
 * 什么是成员方法?
 *      定义在成员位置的且修饰符列表没有static关键字的方法,就是成员方法
 *      成员方法的语法:
 *      [访问权限修饰符] 返回值类型 方法名(形参列表){
 *          // 方法体
 *      }
 *      该语法和我们之前写的方法没有区别,唯一的区别是不能加static修饰
 *      在这里,我们先默认修饰符是public
 *
 * 以上,完成了类的定义,下面开始创建对象.
 *
 * 创建对象的语法:
 *      创建类的对象一般需要在方法中进行
 *      在确定能够创建对象的地方，可以使用以下语法创建对象：
 *      类名 对象名 = new 类名();
 *
 * 对象创建完毕后,如何使用对象呢?
 *      1.访问对象的属性
 *      2.使用对象的行为
 * 以上使用,都只需要用"对象名."来完成就可以了
 *
 * 关于对象中的成员变量的说明:
 *      对象中的成员变量,就类似于数组中的元素
 *      它们都具有默认初始化,都具有默认值
 *      不需要手动初始化,也有默认值
 *
 * @since 20:44
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {

    // 成员位置

    {
        // 局部位置
    }

    public static void main(String[] args) {
        // 局部位置
        // 在这个main方法中,是可以创建Student对象的
        Student stu = new Student();
        // 访问age属性
        System.out.println(stu.age);
        stu.age = 18;
        System.out.println(stu.age);
        // 访问name属性
        System.out.println(stu.name);
        stu.name = "张三";
        System.out.println(stu.name);
        // 调用方法
        stu.sleep();
        stu.study();
    }


}

// 定义学生类
class Student {
    // 用成员变量来描述全体学生对象属性上的共性
    String name;
    int age;
    int stuId;

    // 用成员方法来描述全体学生对象行为上的共性

    public void study() {
        System.out.println("学习使我快乐!");
    }

    public void sleep() {
        System.out.println("上课睡觉,真爽!");
    }
}